package cn.edu.lcu.cs.javateaching.basic;

/**
 * 设计一个简易计算器类Calculator，加深对方法重载的理解。
 * 
 * l 可以对各种数值类型做常见的加减乘除求模运算。
 * 
 * l 加法是必须的，其他运算可选。以下规则以加法（sum）为例。
 * 
 * l 可以对两个相同的byte short int long float double 类型数据进行加法运算，返回结果类型与加数的类型一致。
 * 
 * l 对sum(int , int)方法进行拓展，使它可以对两个以上、个数未知的操作数求和。比如对2个整数求和，100个整数求和，x个整数求和。
 * 
 * @author Ling
 *
 */
public class Calculator {

	public static void main(String[] args) {
		int a = 1;
		int b = 2;
//		int a = 1, b = 2; // 一条语句只声明一个变量，本条语句不太规范
		System.out.println(sum(a, b, 3, 4));
		System.out.println(sum(1, 4)); // 表面上是sum(int， int), jre找最接近的方法去调用，sum（long, long)
		System.out.println(sum(1L, 4L));
	}

	/**
	 * 对至少两个操作数进行求和运算
	 * @param a
	 * @param b
	 * @param orthers 剩余个数未知的参数，它的本质是一个数组
	 * @return
	 */
	public static int sum(int a, int b, int... orthers) {
		int sum = a + b;
		
		// 对orthers参数进行判断，如果非空，遍历这个数组，把各个操作数累加到sum
		if (orthers != null && orthers.length > 0) {
			// 使用 foreach 语句进行迭代
			for (int i : orthers) {
				sum += i;
			}
		}
		
		return sum;
	}

//	public static int sum(int a, int b) {
//		return a + b;
//	}

	public static long sum(long a, long b) {
		return a + b;
	}
	
	public static float sum(float a, float b) {
		return a + b;
	}

	public static double sum(double a, double b) {
		return a + b;
	}

	public static short sum(short a, short b) {
		return (short) (a + b); // 整数的算术+操作符默认按照int类型运算，结果也是int类型，所以要强转为short类型
	}
}
